import Constants from '@/common/constants.js'

var I18Parse = {
    //默认语言
    i18nDefault:Constants.VUE_APP_LANGUAGE,
    //[en-US,zh-CN,ja-JP]
    langs:[],
    //当前语言
    language:uni.getStorageSync('language')
};

/**
 * 解析动态类名称
 * @param name
 * "{"zh-CN":"名称","en-US":"name",....}"
 * @param text 备注，不做计算
 */
I18Parse.install = function (app, options) {
    /**
     * 对数据{"zh-CN":"名称","en-US":"name",....} 进行国际化解析。
     * @param value 需要解析的值
     * @param text  提示信息
     * @returns {string|*}
     */
    const _this =app.config.globalProperties;
    _this.$i18 = function (value,text){
        if(!value){
            return value;
        }
        //先获取设置的语言
        let language= uni.getStorageSync("language");
        if(!language){
            const systemInfo = uni.getSystemInfoSync();
            language=systemInfo.language;
        }
        //如果没有则获取默认语言
        if(!language){
            language=I18Parse.i18nDefault;
        }
        let val="";
        if(typeof value!="string"){
            if(typeof value =='object'){
                try {
                    val=value[language];
                    if(!val){
                        //当前语言找不到，则获取默认语言
                        val=value[I18Parse.i18nDefault];
                    }
                    if(!val){
                        return "";
                    }
                    return val;
                }catch (e){
                    return value;
                }
            }
            return value;
        }
        let rtn= value.indexOf("{")==-1 ;
        if(rtn){
            return value;
        }

        try{
            //{"zh-CN":"名称","en-US":"name",....}
            let jsonName=JSON.parse(value);
            val=jsonName[language];
            if(!val){
                //当前语言找不到，则获取默认语言
                val=jsonName[I18Parse.i18nDefault];
            }
            if(!val){
                return "";
            }
            return val;
        }
        catch (e){
            return value;
        }
    };

    _this.$ti18 = function (name,text,i18Prefix,key){
        if(i18Prefix){
            name = i18Prefix+"."+name;
        }
        let nameVal ="";
        try {
            nameVal =_this.$t(name,[text]);
        }catch (e) {
            nameVal=text;
        }

        if(key){
            let tipVal=_this.$t("rxDecorator."+key,[text]);
            nameVal=tipVal+nameVal;
        }
        return nameVal;
    };
    _this.$comi18 = function (name,text,key){
        let nameVal = this.$ti18(name,text,"rxCommon",key);
        return nameVal;
    };

    /**
     * 根据语言key获取对应的语言。
     *
     *
     * @param langJson
     * 比如:
     * {
     *     name:{
     *         "姓名",
     *     }
     * }
     * @param langKey  建
     * @param text
     * @returns string
     */
    _this.$i18nJson = function(langJson,langKey,text){
        if(!langJson || !langKey){
            return text;
        }

        if(langKey.indexOf('.')==-1){
            return langJson[langKey]||text;
        }

        /**
         * rxList: {
        action:{
            "操作"
        }
        key 应该为: rxList.action
         */
        let keys =langKey.split(".");
        let keyJson =langJson;
        for(let num=0;num<keys.length;num++){
            let key=keys[num];
            keyJson =keyJson[key];
            if(!keyJson){
                return text;
            }
        }
        return keyJson||text;
    };
}

/**
 * 将环境变量VUE_APP_LANGUAGES值转成列表
 * @returns {*}
 */
I18Parse.handleLanList =function(){
    if(I18Parse.langs && I18Parse.langs.length>0){
        return I18Parse.langs;
    }
    let langs=[];
    let langStr =Constants.VUE_APP_LANGUAGES;
    if(!langStr){
        langs.push(I18Parse.i18nDefault);
        return;
    }
    langs= langStr.split("|");
    return langs;
}

I18Parse.langs=I18Parse.handleLanList();

/**
 * 判断当前key是否为语言标识
 * @param key
 * @returns {boolean}
 */
I18Parse.isLangKey =function (key) {
    for(let k=0;k<I18Parse.langs.length;k++){
        if(I18Parse.langs[k]==key){
            return true;
        }
    }
    return false;
}

/**
 * 语言包JSON格式转换。
 * 将
 * {user:{
 *          name:{
 *              zh-CN:"姓名",
 *              en-US:"name",
 *          }
 *      }
 * }
 * 转换成:
 * {
 *     user:{
 *         name:"姓名的形式"
 *     }
 * }
 * @param json
 * @param langKey
 */
I18Parse.langeHandler =function(json,langKey){
    let obj ={};
    I18Parse.setLangObj(obj,json,langKey);
    return obj;
}

/**
 * 根据语言标识计算组装语言json返回
 * 将
 * {user:{
 *          name:{
 *              zh-CN:"姓名",
 *              en-US:"name",
 *          }
 *      }
 * }
 * 转换成:
 * {
 *     user:{
 *         name:"姓名的形式"
 *     }
 * }
 *
 * @param obj
 * @param json
 * @param langKey
 */
I18Parse.setLangObj =function (obj,json,langKey) {
    for(let key in json){
        let subObj =json[key];
        if(typeof(subObj)=='object'){
            let subKey = Object.keys(subObj)[0];
            //是否对象
            let isString=I18Parse.isLangKey(subKey);
            if(isString){
                //不是对象，
                obj[key]=subObj[langKey];
            }else {
                obj[key]={};
                I18Parse.setLangObj(obj[key],subObj,langKey)
            }
        }else {
            //不是对象，
            obj[key]=subObj[langKey];
        }
    }
}

I18Parse.getJsonByKey =function(langJson,langKey){
    if(!langKey){
        return {};
    }
    let keys =langKey.split(".");
    if(keys.length==1){
        return langJson[langKey];
    }
    let keyJson =langJson;
    for(let num=0;num<keys.length;num++){
        let key=keys[num];
        keyJson =I18Parse.getJsonByKey(keyJson,key);
        if(!keyJson){
            return {};
        }
    }
    return keyJson;
}

/**
 * 根据语言key获取对应的语言。
 *
 *
 * @param langJson
 * 比如:
 * {
 *     name:{
 *         "zh-CN": "姓名",
 *         "en-US":"name",
 *     }
 * }
 * @param langKey建
 * @param text
 * @returns {*}
 */
I18Parse.getI18Val =function(langJson,langKey,text){
    if(!langJson || !langKey){
        return text;
    }
    //先获取设置的语言
    let language= uni.getStorageSync("language");
    if(!language){
        const systemInfo = uni.getSystemInfoSync();
        language=systemInfo.language;
    }
    //如果没有则获取默认语言
    if(!language){
        language=I18Parse.i18nDefault;
    }

    if(langKey.indexOf('.')==-1){
        /*返回语言的JSON
        {
            "zh-CN": "权限分配",
            "en-US":"Permission Assignment",
            "ja-JP": "権限の割り当て"
        }*/
        let keyJson=langJson[langKey];
        if(!keyJson){
            return text;
        }
        return keyJson[language]||text;
    }

    /**
     * rxList: {
        action:{
            "zh-CN":"操作",
            "en-US":"Action",
            "ja-JP":"操作"
        }
        key 应该为: rxList.action
     */
    let keys =langKey.split(".");
    let keyJson =langJson;
    for(let num=0;num<keys.length;num++){
        let key=keys[num];
        keyJson =I18Parse.getJsonByKey(keyJson,key);
        if(!keyJson){
            return text;
        }
    }
    return keyJson[language]||text;
}

/**
 * 获取默认语言。
 * 如果没有设置语言，那么就就使用默认语言，如果设置了就使用设置的语言。
 * @param defaultlocale 默认语言
 * @param langObj   语言对象 langObj={
                zhCN:locales.zh_CN,
                enUS:locales.en_US,
                jaJP:locales.ja_JP
            }
 * @returns {*}
 */
I18Parse.setDefaultlocale =function(defaultlocale,langObj){
    let language= uni.getStorageSync("language");
    if(!language){
        return defaultlocale;
    }
    if(language.indexOf('-')>-1){
        let vals=language.split('-');
        let newLang=vals[0]+vals[1];
        defaultlocale=langObj[newLang];
    }
    return defaultlocale;
}


export default I18Parse;
